/**
 *  功能：ESP8266 自动考勤系统(上传)
 *  作者：单片机菜鸟
 *  时间：2020-05-19
 *  描述：
 *      1.OneNet平台端：创建Http协议的产品，创建设备
 *      2.把获取的MAC地址上传到OneNet平台
 */

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
#include <stdlib.h>
#include "H_project.h"

void setup() {
  // put your setup code here, to run once:
  initSystem();
}

void loop() {
  handleSerialData();
  ESP.wdtFeed();
}

/**
 * 处理串口数据
 */
void handleSerialData(){
   if(Serial.available()>0){
     String comdata = "";
     delay(100);
     while(Serial.available()>0){
       comdata =Serial.readStringUntil(']');
     }
     comdata += ']';
     Serial.println("---------- comdata start -----------");
     Serial.println(comdata);
     Serial.println("---------- comdata end -----------");
     // 解析json数组 获得mac地址
     DynamicJsonBuffer jsonBuffer;
     JsonArray& jsonArray = jsonBuffer.parseArray(comdata);
     if (!jsonArray.success()){
        Serial.println(" JSON Parse Failed! ");
     } else {
        Serial.println(" JSON Parse Success! ");
        unique_num = 0;
        if (jsonArray.size() > 0){
             DynamicJsonBuffer jsonBuffer1;
             //创建根，也就是顶节点
            JsonObject& root = jsonBuffer1.createObject();
             //在root对象中加入data数组
            JsonArray& datastreams = root.createNestedArray("datastreams");
            JsonObject& stream = datastreams.createNestedObject();
            stream["id"] = "Mac";
            JsonArray& datapoints = stream.createNestedArray("datapoints");
            for(int index=0;index < jsonArray.size();index ++){
               JsonObject& value1 = datapoints.createNestedObject();
               value1["value"] = jsonArray[index]["value"];
            }

            // 打印上传信息
            String devData;
            root.prettyPrintTo(Serial);

            Serial.println("Upload OneNet Start");
            // 构造json字符串
            String data;
            root.printTo(data);
            // 上传到onenet
            while(!postToDeviceDataPoint(data)){
                retry ++;
                ESP.wdtFeed();
                if(retry == 20){
                 retry = 0;
                 delayRestart(1);
                }
            }
            Serial.println("Upload OneNet Success!"); 
        }
     }
   }
}

/**
 * 初始化系统
 */
void initSystem(){
    Serial.begin (115200);
    Serial.println("\r\n\r\nStart ESP8266 自动考勤(上传)");
    Serial.print("Firmware Version:");
    Serial.println(VER);
    Serial.print("SDK Version:");
    Serial.println(ESP.getSdkVersion());
    ESP.wdtEnable(5000);
    Serial.setRxBufferSize(1024);
    while(Serial.available()>0){
      char c = Serial.read();
    }
    // 连接上网络
    connectToAP();
}

/**
 * 连接到AP热点
 */
void connectToAP(){
    int cnt = 0;
    WiFi.disconnect();
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
          delay(500);
          cnt++;
          Serial.print(".");
          if(cnt>=40){
            cnt = 0;
            //重启系统
            delayRestart(1);
          }
    }
    Serial.println("connect success");
}
